let a: string
let b: number
let c: boolean

a = 'hello'
b = -99
c = false
console.log(a,b,c)

function count(x:number,y:number):number{
  return x + y
}


// 对象类型，object 和 Object 都不方便使用，所以用{}来定义对象类型
let person: {
  name: string,       // ,  ;  换行   三种都行
  age?: number        // ? 可选属性
  [key:string]: any
}

person = {
  name: 'jack',
  age: 18,        // 可选属性，所以可写可不写
  gender: 'male'    // 自定义属性，方便给对象任意添加属性
}

// 函数类型     此处的箭头  =>  在声明时表示函数类型，描述参数和返回值类型
let count1: (a:number,b:number) => number
// count1 = function(x,y){
//   return x + y
// }
count1 = (x,y) => x + y         //此处的箭头  =>   是具体的函数实现

// 数组类型    元组类型被数组类型包含
let arr1: string[]
let arr2: Array<number>

arr1 = ['a', 'b']
arr2 = [1,2,3]

// 枚举类型 数字枚举有反向映射，而字符串枚举则没有反向映射
enum Direction {    //表现形式：[0:'Up',1:'Down',2:'Left',3:'Right',Up:0,Down:1,Left:2,Right:3]
  Up,
  Down,
  Left,
  Right
}
/** 两种使用方法
 * Direction.Up
 * Direction[0]
 *  */ 
const enum Direction2 {    //添加const，表现形式：[0,1,2,3]，除非使用，否则js是不会声明和定义的
  Down,
  Left,
  Right
}

// type 别名，高级用法：联合类型（或） 、 交叉类型（与）
type State = number | string
type State2 = '男' | '女'

type Area = {
  width: number,
  height: number
}

function test(state: State){
  console.log(state)
}